package com.rest.controller;

import com.rest.common.Method;
import com.rest.exception.RRException;
import com.rest.model.DataM;
import com.rest.model.R;
import com.rest.service.DataMService;
import com.rest.util.LRUUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * @author 王战伟
 * @email mrwangzhanwei@163.com
 * @date 2021/3/17  10:30
 * ///////////////////////////////////////////////////////////////////
 * //                          _ooOoo_                               //
 * //                         o8888888o                              //
 * //                         88" . "88                              //
 * //                         (| ^_^ |)                              //
 * //                         O\  =  /O                              //
 * //                      ____/`---'\____                           //
 * //                    .'  \\|     |//  `.                         //
 * //                   /  \\|||  :  |||//  \                        //
 * //                  /  _||||| -:- |||||-  \                       //
 * //                  |   | \\\  -  /// |   |                       //
 * //                  | \_|  ''\---/''  |   |                       //
 * //                  \  .-\__  `-`  ___/-. /                       //
 * //                ___`. .'  /--.--\  `. . ___                     //
 * //              ."" '<  `.___\_<|>_/___.'  >'"".                  //
 * //            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
 * //            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
 * //      ========`-.____`-.___\_____/___.-`____.-'========         //
 * //                           `=---='                              //
 * //      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
 * //            佛祖保佑       永不宕机     永无BUG                   //
 * ////////////////////////////////////////////////////////////////////
 * 接口的增删改查
 */
@RestController
public class ApiController {

    @Autowired
    private DataMService dataMService;

    /**
     * 添加 修改 接口信息
     * @param dataM
     * @return
     */
    @PostMapping("/addOrUpdate")
    public R addapi(@RequestBody DataM dataM){
        Assert.isTrue(!StringUtils.isEmpty(dataM.getMethod()),"请求方式 method 不能为空");
        // 检查请求方式是否支持
        Assert.notNull(Method.getMethod(dataM.getMethod().toUpperCase()),"目前只支持 " + Method.getAllMethod());
        Boolean id = dataM.getId() == null;
        Optional.ofNullable(dataM.getId()).ifPresent(dataId -> {
            Assert.notNull(dataMService.select(dataId),"id不存在!");
        });
        Assert.isTrue( id ? urlExist(dataM.getUrl()) : urlExist_forUpdate(dataM),"该url已存在!");
        return R.ok().put("count",id ? dataMService.insert(dataM) : dataMService.update(dataM));
    }



    /**
     * 删除 接口
     * @param id
     * @return
     */
    @GetMapping("/delete/{id}")
    public R delete(@PathVariable Integer id){
        dataMService.delete(id);
        return R.ok();
    }

    /**
     * 查询所有接口
     * @param num 查询页码
     * @param size 每页数量
     * @return
     */
    @GetMapping("/selectAll")
    public R selectAll(@Param("num") Integer num,@Param("size")Integer size){
        // 所有数据
        List<DataM> dataMS = dataMService.selectAll((num-1) * size,size);
        // 总记录数
        Integer count = dataMService.count();
        R r = R.ok().put("list",dataMS)
                .put("totalCount",count)
                .put("totalPage",(count - 1) / size + 1)
                .put("pageSize",size)
                .put("currPage",num);
        return r;
    }

    /**
     * 根据id查询
     * @param id
     * @return
     */
    @GetMapping("/select/{id}")
    public R selectAll(@PathVariable Integer id){
        DataM dataMS = dataMService.select(id);
        return R.ok().put("data",dataMS);
    }

    /**
     * 判断url 是否存在
     * @param url
     * @return
     */
    @GetMapping("/urlDoesItExist")
    public R urlDoesItExist(@Param("url") String url){
        return R.ok().put("state",urlExist(url));
    }

    /**
     * 判断url 是否存在
     * @param url
     * @return
     */
    private boolean urlExist(String url){
        DataM dataM = dataMService.getDataByUrl(url);
        return null == dataM ? true : false;
    }

    /**
     * 判断url 是否存在 修改时用
     * 如果对象不为空,并且id与传进来参数id 一致 视为不重复 true
     * 如果对象不为空,并且id与传进来参数id 不一致 视为重复 false
     * 如果对象为空 视为重复  false
     * 如果 id 为空
     * @param dataM
     * @return
     */
    private boolean urlExist_forUpdate(DataM dataM) {
        AtomicBoolean state = new AtomicBoolean(true);
        Optional.ofNullable(dataMService.getDataByIdAndUrl(dataM.getId(),dataM.getUrl()))
                .ifPresent(data -> {
                    state.set(false);
                });
        return state.get();
    }

}
